#include <my_header.h>
// 在发送大文件的时候, 客户端有可能在发送的时候提前终止, 这会导致发送端/写端(send)因为抛出SIGPIPE导致进程终止. 
/* Usage:  */
typedef struct train_s
{
    int len;
    char buf[1000];
}train_t;
// 因为send已添加MSG_NOSIGNAL参数，所以13号参数没有抛出
void func(int  num)
{
    printf("num = %d\n", num);
}
// 给客户端回传文件
// 参数：用来和指定客户端通信的socket的文件描述符
int sendFile(int net_fd)
{
    // 注册SIG_PIPE信号
    signal(13, func);

    train_t file_name;
    bzero(&file_name, sizeof(file_name));

    char *str = "1b.txt";
    memcpy(file_name.buf, str, strlen(str));
    file_name.len = strlen(str);

    //send(net_fd, &file_name.len, sizeof(int), 0);
    //send(net_fd, file_name.buf, file_name.len, 0);
    // 和上面两行代码等价:
    // 文件名长度和文件内容长度
    send(net_fd, &file_name, sizeof(int) + file_name.len, 0);

    //发送文件内容
    int file_fd =  open(str, O_RDONLY);
    while(1)
    {
        sleep(1);
        printf("send once! \n");

        char buf[1000] = {0};
        int read_num = read(file_fd, buf, sizeof(buf));
        if(read_num == 0)
        {
            // 发送完毕,文件已读完
            break;
        }
        int res_send1 = send(net_fd, &read_num, sizeof(int), MSG_NOSIGNAL);
        if(res_send1 == -1)
        {
            printf("对端断开连接\n");
            break;
        }
        int res_send2 = send(net_fd, buf, read_num, MSG_NOSIGNAL);
        if(res_send2 == -1)
        {
            printf("对端断开连接\n");
            break;
        }
    }
    close(file_fd);
    return 0;
}


